<?php

namespace app\index\controller;
use app\common\Temp;
use think\Container;
class Demo1
{
	// 最终所有的url 访问都是定位到控制的最终由控制器的某个具体方法执行
	// 一个控制对应着一个类,如果这些类需要进行统一管理怎么办
	// 容器来进行类管理,但是访问的都是控制器 ,但是容器部管理控制器
	// 容器是没有控制器类的 应为控制器是用户之间访问的,容器是帮我管理类的
	// 容器不仅能管理类,还能将类的实例和对象作为对象作为参数传递给类方法进行调用,
	// 这个时候就会自动触发依赖注入
	// 依赖注入:就是将对象的数据以参数方式传递到方法的参数列表
    // url访问:可以通过Get方法将数据传到控制器制定的方法中
	// 但是url 只能传递字符串和数值,
	// 那么如果传递一个对象到方法中应该怎么办?
	//  那么这个时候就需要依赖注入传递
	// 他解决了可以将一个对象传递到一个类里的问题
	// 只要是一个类的方法 都可以接受一个对象传递到方法中
	
	
	// 可以通过字符串,数值用get方法来传值到类方法中
	public function getName($name="wangchenlong")
    {
        return '你好: '.$name;
	}

	// 这样就叫做依赖注入 
	// 这样就会自动实例化
	public function getMethod(\app\common\Temp $temp)
	{
		//这样传值等价于 
		//$temp = new \app\common\Temp;
		$temp->setName('blackchongzi');
		return $temp->getName();
	}
	
	// 绑定一个类到容器
	// 进去的时候 是一个类
	// 出来的时候就是一个对象
	public function bindClass()
	{
		//把一个类放到容器中 相当于注册到容器中
		Container::set('temp','\app\common\Temp');
		// 将容器的类实例化并取出来用,实例化是可调用构造器进行初始化
		$temp = Container::get('temp',['name'=>'梦幻']);
		return $temp->getName();
	}
	
	//绑定一个闭包到容器 (闭包的作用是非常大的大到没变的那种);
	public function bindClosure()
	{
		//将一个闭包放到容器中
		Container::set('demo',function ($domain){
			return '我王晨龙必定会成为一个非常出色的技术者'.$domain;
		});
		
		return Container::get('demo',['domain'=>'2018年国庆留']);
	}
	
	public function dd()
	{
		
	}
}
